package main

import (
	"fmt"
	"math"
	"sort"
)

type jht interface {
	run() float64 //必须要写float64?
	//因为方法中需要有返回值，如果结构中没有返回值，那么实例调用接口中的方法就没有返回值，可以这样理解？
}

type sjx struct {
	base   float64
	height float64
}

func (s sjx) run() float64 {
	area1 := 0.5 * s.base * s.height
	return area1
}

type yx struct {
	r float64
}

func (y yx) run() float64 {
	area2 := math.Pi * math.Pow(y.r, 2)
	return area2
}

type cfx struct {
	len  float64
	wide float64
}

func (c cfx) run() float64 {
	area3 := c.len * c.wide
	return area3
}

func main() {
	s1 := sjx{1.2, 2.1}
	fmt.Printf("%+v\n", s1)
	r1 := yx{1.3}
	fmt.Printf("%+v\n", r1)
	c1 := cfx{3.1, 3.2}
	fmt.Printf("%+v\n", c1)
	fmt.Println(`~~~~~~~~~~~`)
	// S := s1.run()
	// fmt.Println(S)
	J := []jht{s1, r1, c1}
	fmt.Println(J)
	fmt.Println(`------------`)
	//area := make([]float64, len(J))
	var area []float64
	for _, v := range J {
		// fmt.Println(i, v)
		//area[i] = v.run()
		area = append(area, v.run()) //
	}
	fmt.Printf("%.2f\n", area)

	sort.Slice(area, func(i, j int) bool {
		return area[i] > area[j]
	})

	fmt.Printf("%.2f\n", area)

}

// 阿飞老师的批改
// 1. 前面两题实现的不错，如果英文不太好的话，尽量自己多写一点注释，要不后期自己都可能看不懂；
// 2. 第3和第4题也尝试自己做一下。
